﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Otgruzka.ServicesClients;
using BusinessLogic.Statuses;
using BusinessLogic;
using BusinessLogic.Security;
using Common;
using Otgruzka.Helpers;
using System.Configuration;
using DataTier;
using System.ServiceModel;


namespace Otgruzka.WebForms
{
    public partial class OrderDetails : System.Web.UI.Page
    {
        //protected void Page_PreInit(object sender, EventArgs e)
        //{
        //    string theme = ThemesEnum.BasicBlue;
        //    this.Theme = theme;
        //}


        /// <summary>
        /// Возвращает Признак того, что Заказ редактируется администратором
        /// </summary>
        public bool ModifiedByAdmin
        {
            get
            {
                return ((Request.QueryString["modif"] != null && Request.QueryString["modif"].ToLower() == "true") ? true : false);
            }
        }


        protected void Page_Load(object sender, EventArgs e)
        {
        }


        protected override void OnPreRender(EventArgs e)
        {
            BingPromptMessages();
            SetButtonsVisibility();
        }


        /// <summary>
        /// Отображение подсказок из БД
        /// </summary>
        private void BingPromptMessages()
        {
            try
            {
                string[] messages = new PromptMessagesClient().GetPromptMessages(this.AppRelativeVirtualPath.Substring(this.AppRelativeVirtualPath.LastIndexOf("/") + 1)).ToArray();

                if (messages != null && messages.Count() > 0)
                {
                    this.PromptMessagesRepeater.DataSource = messages;
                    this.PromptMessagesRepeater.DataBind();
                    this.PromptMessagesRepeater.Visible = true;
                }
                else
                {
                    this.PromptMessagesRepeater.Visible = false;
                }
            }
            catch (Exception ex)
            {
            }
        }


        /// <summary>
        /// Отображает доступные кнопки перехода в статусы
        /// </summary>
        void SetButtonsVisibility()
        {
            int currentId = (int)OrderDetailsControl.Id;
            int currentStatus = (int)OrderDetailsControl.StatusId;

            this.btnOpenWindowSendBoss.Visible = this.btnBackToStatusProject.Visible = this.btnNewAccount.Visible = this.btnExpendBill.Visible = this.btnDeleteOrder.Visible = this.btnModifiedAdmin.Visible = false;
            

            var nextStatuses = new NextStatusGetter().GetNextStatuses(currentStatus);

            if (!OrderDetailsControl.ExistsIsUnavailable)
            {
                if (!this.ModifiedByAdmin)
                {
                    this.btnBackToStatusProject.Visible = nextStatuses.Contains((int)StateEnum.Project) && UserPrincipal.Current.ExistStatePermission((int)StateEnum.Project);
                    this.btnOpenWindowSendBoss.Visible = nextStatuses.Contains((int)StateEnum.Sended) && UserPrincipal.Current.ExistStatePermission((int)StateEnum.Sended);
                }
                this.btnNewAccount.Visible = nextStatuses.Contains((int)StateEnum.CreatedAccount) && UserPrincipal.Current.ExistStatePermission((int)StateEnum.CreatedAccount);
                this.btnExpendBill.Visible = (nextStatuses.Contains((int)StateEnum.PartialDispatch) || nextStatuses.Contains((int)StateEnum.FullDispatch)) &&
                                             (UserPrincipal.Current.ExistStatePermission((int)StateEnum.PartialDispatch) || UserPrincipal.Current.ExistStatePermission((int)StateEnum.FullDispatch));
                //this.btnPrintBill.Visible = (nextStatuses.Contains((int)StateEnum.PartialDispatch) || nextStatuses.Contains((int)StateEnum.FullDispatch)) && 
                //                            (UserPrincipal.Current.ExistStatePermission((int)StateEnum.PartialDispatch) || UserPrincipal.Current.ExistStatePermission((int)StateEnum.FullDispatch));
            }

            // Необходимо использовать значение столбца ModifOtherDocum в таблице Role
            if (UserPrincipal.Current.ModifOtherDocum && (currentStatus == (int)StateEnum.CreatedAccount || currentStatus == (int)StateEnum.PartialDispatch)) // TODO: фейк, пока нет реализации права доступа к этой кнопке делаю ее видимой админу
            {
                this.btnModifiedAdmin.Visible = true;
            }


            // Кнопка удаления доступна только для Заказов в статусе Проект
            this.btnDeleteOrder.Visible = (currentStatus == (int)StateEnum.Project) ? true : false;
        }


        #region События клика на кнопки перехода в разные статусы

        protected void btnModifiedAdmin_Click(object sender, EventArgs e)
        {
            var client = new StatesClient();
            try
            {
                int currentId = (int)OrderDetailsControl.Id;
                if (currentId != 0)
                {
                    // Вызвать сервис смены статуса
                    client.SetDocumentState(UserPrincipal.Current.UserId, (int)DocTypeEnum.Order, currentId, (int)StateEnum.Project);

                    //=========================================================================================================================================================
                    //=================  НЕОБХОДИМО ПРОСТАВИТЬ ПРИЗНАК ТОГО, ЧТО ЭТО ПРОИСХОДИТ ИЗМЕНЕНИЕ ЗАКАЗА АДМИНИСТРАТОРОМ. (GET-параметром) ============================
                    //=================  ДАЛЕЕ ВСЯ ЛОГИКА НАСТРОЙКИ ЗАКАЗА БУДЕТ ПРОИЗВОДИТЬСЯ В КОНТРОЛЕ OrderDetailsControl =================================================
                    //=========================================================================================================================================================

                    //Перегрузить страницу чтобы показались изменения
                    Response.Redirect(string.Format("~/WebForms/OrderDetails.aspx?oid={0}&modif=true", currentId), true);
                    //ScriptManager.RegisterStartupScript(this, this.GetType(), Guid.NewGuid().ToString(), "window.location.href = window.location.href;", true);
                    //OrderDetailsControl.BindOrder();

                    //SetButtonsVisibility();
                }
            }
            catch (System.ServiceModel.FaultException<ExceptionDetail> ex)
            {
                string message = client.GetExceptionDetail(ex);
                this.ErrorMessage.Text = message;
            }
            catch (System.Exception exp)
            {
                this.ErrorMessage.Text = exp.Message;
            }
        }


        protected void btnBackToStatusProject_Click(object sender, EventArgs e)
        {
            var client = new StatesClient();
            try
            {
                int currentId = (int)OrderDetailsControl.Id;
                if (currentId != 0)
                {
                    // Вызвать сервис смены статуса
                    client.SetDocumentState(UserPrincipal.Current.UserId, (int)DocTypeEnum.Order, currentId, (int)StateEnum.Project);

                    //Перегрузить страницу чтобы показались изменения
                    //Response.Redirect(string.Format("~{0}", Request.Url.PathAndQuery), true);
                    //ScriptManager.RegisterStartupScript(this, this.GetType(), Guid.NewGuid().ToString(), "window.location.href = window.location.href;", true);
                    OrderDetailsControl.BindOrder();
                    SetButtonsVisibility();
                }
            }
            catch (System.ServiceModel.FaultException<ExceptionDetail> ex)
            {
                string message = client.GetExceptionDetail(ex);
                this.ErrorMessage.Text = message;
            }
            catch (System.Exception exp)
            {
                this.ErrorMessage.Text = exp.Message;
            }
        }

        protected void btnNewAccount_Click(object sender, EventArgs e)
        {
            var client = new StatesClient();
            try
            {
                int currentId = (int)OrderDetailsControl.Id;
                if (currentId != 0)
                {
                    // Вызвать сервис смены статуса
                    client.SetDocumentState(UserPrincipal.Current.UserId, (int)DocTypeEnum.Order, currentId, (int)StateEnum.CreatedAccount);

                    // Отправить письмо менеджеру компании Мегаофис с детальной информацией о Заказе
                    var processor = new MessageProcessor();
                    var oClient = new OrdersClient();
                    var order = oClient.GetOrder(UserPrincipal.Current.UserId, currentId);
                    string tableOrder = ObjectToHtmlHelper.GetOrderHTML(order, true);

                    string fromAddressName = OrderDetailsControl.ContactNameString; //UserPrincipal.Current.UserFullName;
                    var clientSettings = new SettingsClient();
                    var setting = clientSettings.GetSettingValue("ManagerEMail");
                    string email = (setting != null) ? setting.SettingValue : ConfigurationManager.AppSettings["AdminEmailAddress"];
                    processor.ProcessSendMessage(tableOrder, email, fromAddressName, string.Format("Счет сформирован № {0}  к заказу № {1}", order.Header.AccNumber, order.Header.Number));

                    //Перегрузить страницу чтобы показались изменения
                    //Response.Redirect(string.Format("~{0}", Request.Url.PathAndQuery), true);
                    //ScriptManager.RegisterStartupScript(this, this.GetType(), Guid.NewGuid().ToString(), "window.location.href = window.location.href;", true);
                    OrderDetailsControl.BindOrder();
                    SetButtonsVisibility();

                    // Открывается окно с уведомлением о сроках доставки нового заказа
                    ScriptManager.RegisterStartupScript(this, this.GetType(), "delayDeliveryInfo_window", "delayDeliveryInfo()", true);
                }
            }
            catch (System.ServiceModel.FaultException<ExceptionDetail> ex)
            {
                string message = client.GetExceptionDetail(ex);
                this.ErrorMessage.Text = message;
            }
            catch (System.Exception exp)
            {
                this.ErrorMessage.Text = exp.Message;
            }
        }


        protected void btnSendBoss_Click(object sender, EventArgs e)
        {
            int currentId = (int)OrderDetailsControl.Id;
            if (currentId != 0)
            {
                var client = new StatesClient();
                try
                {
                    // Вызвать сервис смены статуса
                    client.SetDocumentState(UserPrincipal.Current.UserId, (int)DocTypeEnum.Order, currentId, (int)StateEnum.Sended);

                    //Перегрузить страницу чтобы показались изменения
                    //Response.Redirect(string.Format("~{0}", Request.Url.PathAndQuery), true);
                    //ScriptManager.RegisterStartupScript(this, this.GetType(), Guid.NewGuid().ToString(), "window.location.href = window.location.href;", true);
                    //Server.Transfer(string.Format("~{0}", Request.Url.PathAndQuery));
                    OrderDetailsControl.BindOrder();
                    SetButtonsVisibility();
                }
                catch (System.ServiceModel.FaultException<ExceptionDetail> ex)
                {
                    string message = client.GetExceptionDetail(ex);
                    this.ErrorMessage.Text = message;
                }
                catch (System.Exception exp)
                {
                    this.ErrorMessage.Text = exp.Message;
                }
            }
        }


        protected void btnExpendBill_Click(object sender, EventArgs e)
        {
            int currentId = (int)OrderDetailsControl.Id;
            if (currentId != 0)
            {
                // Сформировать и сохранить расходную накладную. Это надо сделать на отдельной странице в которой будет возможность редактировать расходную накладную
                Response.Redirect(string.Format("~/WebForms/ExpendBillDetails.aspx?oid={0}", currentId), true);
            }
        }


        protected void btnDeleteOrder_Click(object sender, EventArgs e)
        {
            int currentId = (int)OrderDetailsControl.Id;
            if (currentId != 0)
            {
                var client = new OrdersClient();
                try
                {
                    // Вызвать сервис удаления Заказа
                    client.DeleteOrder(UserPrincipal.Current.UserId, currentId);

                    //Переход на список Заказов
                    Response.Redirect("~/WebForms/OrderList.aspx", true);
                }
                catch (System.ServiceModel.FaultException<ExceptionDetail> ex)
                {
                    string message = client.GetExceptionDetail(ex);
                    this.ErrorMessage.Text = message;
                }
                catch (System.Exception exp)
                {
                    this.ErrorMessage.Text = exp.Message;
                }
            }
        }

        #endregion События клика на кнопки перехода в разные статусы


        protected void btnExcelButton_Click(object sender, EventArgs e)
        {
            OrderDetailsControl.ExportToExcel();
        }
    }
}